////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Στο παρόν έχουμε συγκεντρωμένες μεθόδους και functions που αφορούν στις
// πληροφορίες προφίλ. Ως γνωστόν, οι πληροφορίες προφίλ των παικτών είναι
// δομημένες σε πίνακα της database κατά παίκτη και σχολιαστή. Αυτό σημαίνει
// ότι ο κάθε παίκτης συνοδεύεται από πληροφορίες προφίλ που συντάσσει είτε
// ο ίδιος, είτε οι υπόλοιποι παίκτες γι' αυτόν.
//
// Οι πληροφορίες προφίλ του παίκτη που έχει συντάξει ο ίδιος εμφανίζονται
// δημοσίως και αφορούν σε πληροφορίες που ίδιος επιθυμεί να δημοσιοποιήσει.
// Τέτοιες πληροφορίες μπορούν να είναι, π.χ. το αν του αρέσει να παίζει τους
// άσους, το αν ακολουθεί ή όχι κάποιες συμβάσεις στο παιχνίδι του κλπ.
//
// Οι πληροφορίες προφίλ που συντάσσουν οι υπόλοιποι παίκτες για κάποιον άλλον
// παίκτη είναι προσωπικές, αφορούν μόνο τον συντάκτη και δεν υπάρχει τρόπος
// να δημοσιοποιηθούν στους υπόλοιπους παίκτες (ούτε, φυσικά, στον παίκτη στον
// οποίο αφορούν). Μπορούμε, π.χ. να γράψουμε την άποψή μας για τον παίκτη,
// κάποιο τηλέφωνο επικοινωνίας που έχει εμπιστευθεί μόνο σε μάς κλπ.
//
// Οι πληροφορίες προφίλ εμφανίζονται σε DOM elements που είναι χωρισμένα σε
// τέσσερις περιοχές: επικεφαλίδα, πληροφορίες προφίλ τού παίκτη, πληροφορίες
// προφίλ δικές μας για τον παίκτη (προσωπικά δεδομένα), και control panel.
//
// Στην επικεφαλίδα εμφανίζεται το όνομα και το login name τού παίκτη, εικονίδιο
// εμφάνισης/απόκρυψης της φωτογραφίας του παίκτη, και εικονίδια αύξομείωσης
// των δύο περιοχών πληροφοριών προφίλ (σχολίων τού ίδιου του παίκτη και των
// δικών μας σχολίων).
//
// Στο control panel εμφανίζονται διάφορα πλήκτρα και εικονίδια με τα οποία
// μπορούμε να συσχετιστούμε με τον παίκτη, να τον προσκαλέσουμε στο τραπέζι
// μας, να εισαγάγουμε ή να ενημερώσουμε πληροροφορίες, κλπ.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "sinedriaProfinfoJQL" επιστρέφει jQuery element list με
// το profinfo div element τού παίκτη τής ανά χείρας συνεδρίας.

Sinedria.prototype.sinedriaProfinfoJQL = function() {
	return Pektis.profinfoJQL(this.pektis);
}

// Η μέθοδος "profinfoJQL" επιστρέφει jQuery element list με
// το profinfo div element του ανά χείρας παίκτη.

Pektis.prototype.pektisProfinfoJQL = function() {
	return Pektis.profinfoJQL(this.login);
}

// Η function "profinfoJQL" δέχεται το login name κάποιου παίκτη
// και επιστρέφει jQuery element list με το profinfo div element
// του συγκεκριμένου παίκτη.

Pektis.profinfoJQL = function(login) {
	return $('#PF' + Client.jqsel(login));
}

// Η μέθοδος "pektisProfinfoEditJQL" επιστρέφει jQuery element list με
// το profinfo edit div elemnt του ανά χείρας παίκτη.

Pektis.prototype.pektisProfinfoEditJQL = function() {
	return Pektis.profinfoEditJQL(this.login);
}

// Η function "profinfoEditJQL" δέχεται το login name κάποιου παίκτη
// και επιστρέφει jQuery element list με το profinfo edit div element
// του συγκεκριμένου παίκτη.

Pektis.profinfoEditJQL = function(login) {
	return $('#PE' + Client.jqsel(login));
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθοδος "profinfoDOM" εμφανίζει profinfo DOM element για τον ανά
// χείρας παίκτη. Το DOM element θα εμφανιστεί σε βολική θέση τής
// σελίδας και θα καταστεί συρόμενο και απκρυπτόμενο.

Pektis.prototype.profinfoDOM = function() {
	var pektis, ofelimo, XY;

	ofelimo = $('#ofelimo').akrivosEna();
	XY = ofelimo.offset();

	XY.left += globals.random(0, 510);
	XY.top = globals.random(0, 230) - 70;

	pektis = this;
	Pektis.profinfoClearEndixi();
	$('<div id="PF' + this.login + '" class="profinfoBox">').
		appendTo(ofelimo).profinfoFixDOM(this).
		siromeno().pineza(function(div) {
			div.profinfoClose(pektis.login);
		}).offset(XY).fadeIn().anadisi().

		// Ακυρώνουμε τις διαδικασίες μετακίνησης για τα εικονίδια
		// του profinfo DOM element.
		find('.profinfoIcon').siromeno(false);

	return this;
}

// Η jQuery μέθοδος "profinfoClose" εφαρμόζεται πάνω σε profinfo DOM element
// και αποσύρει το DOM element μαζί με τυχόν σχετικό DOM element επεξεργασίας
// πληροφοριών προφίλ. Ως παράμετρο δέχεται το login name του παίκτη στον οποίο
// αφορά το ανά χείρας profinfo DOM element.

jQuery.fn.profinfoClose = function(login) {
	return this.each(function() {
		Pektis.profinfoClearEndixi();
		$(this).add(Pektis.profinfoEditJQL(login)).fadeOut(function() {
			$(this).remove();
		});
	});
}

// Η function "profinfoClear" διαγράφει όλα τα profinfo DOM elements
// από το DOM. Διαγράφονται, επίσης, και τυχόν ανοικτά DOM elements
// επεξεργασίας πληροφοριών προφίλ.

Pektis.profinfoClear = function(e, ico, login) {
	$('.profinfoBox,.profinfoEdit').stop().fadeOut(70, function() {
		$(this).remove();
	});
}

// Η jQuery μέθοδος "profinfoFixDOM" εφαρμόζεται επί profinfo DOM element συγκεκριμένου
// παίκτη και σκοπό έχει την εκ βάθρων διαμόρφωση, ή αναδιαμόρφωση του συγκεκριμένου DOM
// element, σύμφωνα με την τρέχουσα κατάσταση του παίκτη, τον οποίο, εξάλλου, περνάμε ως
// παράμετρο.

jQuery.fn.profinfoFixDOM = function(pektis) {
	return this.akrivosEna().each(function() {
		$(this).
			protipo('#profinfoProtipo').
			profinfoHeaderFixDOM(pektis).
			profinfoPektisFixDOM(pektis).
			profinfoEgoFixDOM(pektis).
			profinfoFooterFixDOM(pektis).
			profinfoOnlineFixDOM(pektis.login).
			profinfoSxesiFixDOM(pektis.login).
		on('mouseenter', function() {
			pektis.pektisProfinfoEditJQL().addClass('profinfoEpilogi');
		}).
		on('mouseleave', function() {
			pektis.pektisProfinfoEditJQL().removeClass('profinfoEpilogi');
		});
	});
}

jQuery.fn.profinfoHeaderFixDOM = function(pektis) {
	return this.akrivosEna().each(function() {
		var header, icon, box, afxisi;

		box = $(this);
		header = box.find('.profinfoHeader').akrivosEna();
		icon = header.find('.profinfoIconPhoto').attr({
			src: Client.missingPhoto,
		}).on('mouseenter', function(e) {
			e.stopPropagation();
			box.find('.profinfoPhoto').addClass('profinfoEpilogi');
		}).on('mouseleave', function(e) {
			e.stopPropagation();
			box.find('.profinfoPhoto').removeClass('profinfoEpilogi');
		}).on('mousedown', function(e) {
			e.stopPropagation();
		}).on('click', function(e) {
			var photo;

			Prefadoros.input.apiko(e);

			photo = box.find('.profinfoPhotoContainer');

			// Αν η φωτογραφία τού παίκτη υπάρχει ήδη στο DOM, τη σβήνουμε.

			if (photo.length) {
				photo.find('img').stop().animate({width: 0}, 270, function() {
					photo.remove();
				});
				icon.attr({
					title: 'Φωτογραφία παίκτη',
				});
			}

			// Η φωτογραφία τού παίκτη δεν υπήρχε στο DOM, επομένως θα την
			// εμφανίσουμε τώρα και θα την καταστήσουμε συρόμενη και αποκρυπτόμενη.

			else {
				photo = $('<div class="profinfoPhotoContainer">').appendTo(box).
				siromeno().anadisi().pineza(function(div) {
					icon.trigger('click');
				}).on('mouseenter', function(e) {
					e.stopPropagation();
					box.addClass('profinfoEpilogi');
					pektis.pektisProfinfoEditJQL().addClass('profinfoEpilogi');
				}).on('mouseleave', function(e) {
					e.stopPropagation();
					box.removeClass('profinfoEpilogi');
					pektis.pektisProfinfoEditJQL().removeClass('profinfoEpilogi');
				});
				$('<img class="profinfoPhoto" src="' + Client.pektisPhotofile(pektis.login) + '" />').
				attr({title: pektis.onoma + ' [ ' + pektis.login + ' ]'}).
				on('error', function() {
					$(this).attr({src: 'images/misc/provlima.gif'});
				}).appendTo(photo).stop().animate({width: Client.photoPektisWidth});
				$(this).attr({
					title: 'Απόκρυψη φωτογραφίας παίκτη',
				});
			}
		});
		header.find('.profinfoHeaderOnoma').text(pektis.onoma);
		header.find('.profinfoHeaderLogin').text(pektis.login);
		header.find('.profinfoAxiomaIcon').axiomaIconFixDOM(pektis);

		afxisi = true;
		header.find('.profinfoAfxomiosiIcon').on('click', function(e) {
			var profinfo, pektis, ego, t;

			Prefadoros.input.apiko(e);
			profinfo = $(this).parents('.profinfoBox');
			pektis = profinfo.find('.profinfoInfoPektis');
			ego = profinfo.find('.profinfoInfoEgo');

			t = 170;
			if (afxisi) {
				switch (ego.css('maxHeight')) {
				case '336px':
					ego.animate({maxHeight: '220px'}, t);
					pektis.css({visibility: 'visible'}).animate({maxHeight: '100px'}, t);
					break;
				case '220px':
					ego.animate({maxHeight: '100px'}, t);
					pektis.animate({maxHeight: '220px'}, t);
					break;
				case '100px':
					ego.animate({maxHeight: 0}, t, function() {
						$(this).css({visibility: 'hidden'});
					});
					pektis.animate({maxHeight: '336px'}, t);
					break;
				default:
					pektis.animate({maxHeight: '220px'}, t);
					ego.css({visibility: 'visible'}).animate({maxHeight: '100px'}, t);
					$(this).strofi(0, 90);
					afxisi = !afxisi;
					break;
				}
			}
			else {
				switch (pektis.css('maxHeight')) {
				case '336px':
					pektis.animate({maxHeight: '220px'}, t);
					ego.css({visibility: 'visible'}).animate({maxHeight: '100px'}, t);
					break;
				case '220px':
					pektis.animate({maxHeight: '100px'}, t);
					ego.animate({maxHeight: '220px'}, t);
					break;
				case '100px':
					pektis.animate({maxHeight: 0}, t, function() {
						$(this).css({visibility: 'hidden'});
					});
					ego.animate({maxHeight: '336px'}, t);
					break;
				default:
					ego.animate({maxHeight: '220px'}, t);
					pektis.css({visibility: 'visible'}).animate({maxHeight: '100px'}, t);
					$(this).strofi(90, 0);
					afxisi = !afxisi;
					break;
				}
			}
		});
	});
}

// Η μέθοδος "profinfoPektisFixDOM" εφαρμόζεται σε profinfo DOM element κάποιου
// παίκτη και σκοπό έχει την επανεμφάνιση τών πληροροφοριών προφίλ που έχει
// συντάξει ο ίδιος ο παίκτης για τον εαυτό του. Ως παράμετρο δέχεται τον
// ίδιο τον παίκτη.

jQuery.fn.profinfoPektisFixDOM = function(pektis) {
	return this.akrivosEna().each(function() {
		var info = $(this).find('.profinfoInfoPektis').akrivosEna();
		if (pektis.fetchProp('profinfo').hasOwnProperty(pektis.login)) info.html(pektis.profinfo[pektis.login]);
		else info.empty();
	});
}

// Η μέθοδος "profinfoEgoFixDOM" εφαρμόζεται σε profinfo DOM element κάποιου
// παίκτη και σκοπό έχει την επανεμφάνιση τών πληροροφοριών προφίλ που έχουμε
// συντάξει εμείς για τον παίκτη. Ως παράμετρο δέχεται τον ίδιο τον παίκτη.

jQuery.fn.profinfoEgoFixDOM = function(pektis) {
	return this.akrivosEna().each(function() {
		var info = $(this).find('.profinfoInfoEgo').akrivosEna();
		if (pektis.oxiEgo() && pektis.fetchProp('profinfo').hasOwnProperty(Prefadoros.ego.login))
			info.html(pektis.profinfo[Prefadoros.ego.login]);
		else info.empty();
	});
}

// Η μέθοδος "profinfoFooterFixDOM" διαμορφώνει το control panel τού profinfo
// DOM element, δηλαδή το κάτω μέρος στο οποίο υπάρχουν διάφορα πλήκτρα και
// εικονίδια μέσω των οποίων κάνουμε διάφορους χειρισμούς με τον παίκτη.

jQuery.fn.profinfoFooterFixDOM = function(pektis) {
	return this.akrivosEna().each(function() {
		var profinfo, prosklisi, sxolia, save, akiro, klisimo;

		profinfo = $(this);

		profinfo.find('.profinfoIconFilos').on('click', function(e) {
			Pektis.iconAction.filos(e, $(this), pektis.login);
		});
		profinfo.find('.profinfoIconApoklismos').on('click', function(e) {
			Pektis.iconAction.apoklismos(e, $(this), pektis.login);
		});
		profinfo.find('.profinfoIconAposisxetisi').on('click', function(e) {
			Pektis.iconAction.aposisxetisi(e, $(this), pektis.login);
		});
		profinfo.find('.profinfoIconIplocator').on('click', function(e) {
			Pektis.iconAction.iplocator(e, $(this), pektis.login);
		});

		prosklisi = $(this).find("input[value='Πρόσκληση']");
		sxolia = $(this).find("input[value='Σχόλια']");
		save = $(this).find("input[value='Αποθήκευση']");
		akiro = $(this).find("input[value='Άκυρο']");
		klisimo = $(this).find("input[value='Κλείσιμο']");

		if (Prefadoros.ego.sinedria.oxiProsklisiDikeoma()) prosklisi.css({display: 'none'});
		prosklisi.on('click', function(e) {
			Prosklisi.apostoli(e, pektis.login);
		});

		sxolia.on('click', function(e) {
			var jql, edit, kimeno, info, proepiskopisi;

			Prefadoros.input.apiko(e);
			Pektis.profinfoEpilogi(pektis.login, false);

			// Αν υπάρχει το DOM element επεξεργασίας πληροφοριών προφίλ,
			// το διαγράφουμε και επαναφέρουμε τα πλήκτρα στην αρχική τους
			// κατάσταση.

			jql = pektis.pektisProfinfoEditJQL();
			if (jql.length) {
				jql.remove();
				sxolia.css({display: 'inline'});
				save.css({display: 'none'});
				akiro.css({display: 'none'});
				return;
			}

			// Δεν υφίστατο DOM element επεξεργασίας πληροφοριών προφίλ για τον
			// παίκτη, επομένως θα το δημιουργήσουμε τώρα.

			edit = $('<div>').protipo('#profinfoEditProtipo').attr({
				id: 'PE' + pektis.login,
			}).addClass('formaData profinfoEdit').
			on('mouseenter', function() {
				profinfo.addClass('profinfoEpilogi').
				find('.profinfoPhoto').addClass('profinfoEpilogi');
			}).
			on('mouseleave', function() {
				profinfo.removeClass('profinfoEpilogi').
				find('.profinfoPhoto').removeClass('profinfoEpilogi');
			});

			edit.find('.profinfoEditHeaderLogin').text(pektis.login);
			edit.find('.profinfoEditText').text(profinfo.find(pektis.isEgo() ?
				'.profinfoInfoPektis' : '.profinfoInfoEgo').html());

			// Το DOM element επεξεργασίας πληροφοριών προφίλ καθίσταται συρόμενο
			// και αποκρυπτόμενο, και μάλιστα κινείται ανεξάρτητα από το σχετικό
			// profinfo DOM element.

			edit.appendTo('#ofelimo').siromeno({
				top: (parseInt(profinfo.css('top')) + 100) + 'px',
				left: (parseInt(profinfo.css('left')) + 200) + 'px',
			}).pineza(function(div) {
				Pektis.profinfoEpilogi(pektis.login, false);
				sxolia.css({display: 'inline'});
				save.css({display: 'none'});
				akiro.css({display: 'none'});
				div.fadeOut(function() {
					div.remove();
				});
			}).

			// Ακυρώνουμε τις διαδικασίες μετακίνησης για την περιοχή γραφής, αλλά
			// λαμβάνουμε μέριμνα για το focus κλπ.

			anadisi().find('textarea').focus().siromeno(false).
			on('click', function(e) {
				e.stopPropagation();
				$(this).parents('.profinfoEdit').anadisi();
			})

			// Φέρουμε τα πλήκτρα σε κατάσταση επεξεργασίας πληροφοριών προφίλ.

			sxolia.css({display: 'none'});
			save.css({display: 'inline'});
			akiro.css({display: 'inline'});

			// Κανονίζουμε τα σχετικά με την άμεση προεπισκόπηση των γραφομένων.

			kimeno = edit.find('textarea');
			info = pektis.pektisProfinfoJQL().find(pektis.isEgo() ?
				'.profinfoInfoPektis' : '.profinfoInfoEgo');
			proepiskopisi = function() {
				info.html(kimeno.val());
			}

			kimeno.on('keyup', function() {
				proepiskopisi();
			}).

			// Όσον αφορά στο copy/paste πρέπει να εφαρμόσω μικρή καθυστέρηση, αλλιώς
			// προεπισκοπείται το κείμενο πριν την αλλαγή.

			on('cut paste', function() {
				setTimeout(function() {
					proepiskopisi();
				}, 10);
			});

			// Θέτω click event listeners για τα πλήκτρα του DOM element επεξεργασίας
			// πληροφοριών προφίλ. Χρησιμοποιούμε τους event listeners του πατρικού
			// profinfo DOM element.

			pektis.pektisProfinfoEditJQL().find("input[value='Αποθήκευση']").on('click', function(e) {
				e.stopPropagation();
				save.trigger('click');
			});

			// Για την ακύρωση χρησιμοποιούμε το (ανενεργό σε αυτή τη φάση) πλήκτρο
			// εμφάνισης/απόκρυψης σχολίων του πατρικού profinfo DOM element.

			pektis.pektisProfinfoEditJQL().find("input[value='Άκυρο']").on('click', function(e) {
				e.stopPropagation();
				sxolia.trigger('click');
			});
		});

		save.css({display: 'none'}).on('click', function(e) {
			e.stopPropagation();
			Pektis.profinfoEpilogi(pektis.login, false);
			Client.node('profinfoUpdate',
				'login=' + pektis.login.uri(),
				'kimeno=' + pektis.pektisProfinfoEditJQL().find('textarea').val().trim().uri(),
			function(rsp) {
				if (rsp) return Client.fyi.epano(rsp);
				sxolia.trigger('click');
			});
		});

		akiro.css({display: 'none'}).on('click', function(e) {
			e.stopPropagation();
			sxolia.trigger('click');
		});

		klisimo.css({display: 'inline'}).on('click', function(e) {
			e.stopPropagation();
			Pektis.profinfoJQL(pektis.login).profinfoClose(pektis.login);
		});
	});
}

jQuery.fn.profinfoSxesiFixDOM = function(login) {
	return this.each(function() {
		if (Prefadoros.ego.pektis.isFilos(login)) {
			$(this).find('.profinfoHeaderLogin').removeClass('apoklismenos').addClass('filos');
			$(this).find('.profinfoIconFilos').css({display: 'none'});
			$(this).find('.profinfoIconApoklismos,.profinfoIconAposisxetisi').css({display: 'inline'});
		}
		else if (Prefadoros.ego.pektis.isApoklismenos(login)) {
			$(this).find('.profinfoHeaderLogin').removeClass('filos').addClass('apoklismenos');
			$(this).find('.profinfoIconApoklismos').css({display: 'none'});
			$(this).find('.profinfoIconFilos,.profinfoIconAposisxetisi').css({display: 'inline'});
		}
		else {
			$(this).find('.profinfoHeaderLogin').removeClass('filos apoklismenos');
			$(this).find('.profinfoIconAposisxetisi').css({display: 'none'});
			$(this).find('.profinfoIconFilos,.profinfoIconApoklismos').css({display: 'inline'});
		}
	});
}

jQuery.fn.profinfoOnlineFixDOM = function(login) {
	return this.each(function() {
		if (Skiniko.isSinedria(login)) $(this).find('.profinfoHeaderLogin').removeClass('profinfoOffline');
		else $(this).find('.profinfoHeaderLogin').addClass('profinfoOffline');
	});
}

// Η function "profifoClearEndixi" καλείται κατά το άνοιγμα και το
// κλείσιμο των παραθύρων προφίλ και κάνει εμφανές το εικονίδιο
// μαζικού κλεισίματος των παραθύρων προφίλ.

Pektis.profinfoClearEndixi = function() {
	$('#PLprofinfo').endixi(1500);
}

Pektis.profinfo = function(e, ico, login) {
	var src, jql;

	e.stopPropagation();
	Prefadoros.input.apiko();

	jql = Pektis.profinfoJQL(login);
	if (jql.length) return jql.profinfoClose(login);

	src = $(ico).attr('src');
	$(ico).working();

	Client.node('pektisSnapshot', 'login=' + login.uri(), function(rsp) {
		var snapshot, pektis;

		$(ico).attr({'src': src});
		try {
			eval('snapshot = ' + rsp + ';');
		}
		catch(err) {
			Client.fyi.epano(rsp);
			return;
		}

		pektis = Skiniko.isPektis(login);
		if (pektis) pektis.snapshotSet(snapshot);
		else pektis = (new Pektis()).snapshotSet(snapshot).pektisAdd();
		pektis.pektisFixDOM().profinfoDOM();
	});
}

// Η function "profinfoEpilogi" δέχεται το login name κάποιου παίκτη και αφού
// εντοπίσει όλα τα σχετικά profinfo DOM elements, τα καθιστά εμφανή ή όχι,
// ανάλογα με το αν η δεύτερη παράμετρος είναι αληθής ή όχι αντίστοιχα.

Pektis.profinfoEpilogi = function(login, nai) {
	var jql, photo;

	jql = Pektis.profinfoJQL(login);
	photo = jql.find('.profinfoPhoto');
	jql = jql.add(photo).add(Pektis.profinfoEditJQL(login));

	if (nai === undefined) nai = true;
	if (nai) jql.addClass('profinfoEpilogi');
	else jql.removeClass('profinfoEpilogi');
}
